// Copyright Epic Games, Inc. All Rights Reserved.

#include "Input/LyraMappableConfigPair.h"

// 包含头文件

#include "CommonUISettings.h"
#include "ICommonUIModule.h"
#include "PlayerMappableInputConfig.h"
#include "Settings/LyraSettingsLocal.h"
#include "System/LyraAssetManager.h"

// 包含所需模块：
// - CommonUISettings: 通用UI设置
// - ICommonUIModule: 通用UI模块接口
// - PlayerMappableInputConfig: 玩家可映射输入配置
// - LyraSettingsLocal: 本地设置
// - LyraAssetManager: 资源管理器

#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraMappableConfigPair)

// UE内联生成代码

// 检查配置对是否可以激活的实现
bool FMappableConfigPair::CanBeActivated() const
{
	// 获取当前平台的特性
	const FGameplayTagContainer& PlatformTraits = ICommonUIModule::GetSettings().GetPlatformTraits();

	// 如果依赖特性不为空且当前平台不具有所有依赖特性，则不激活
	if (!DependentPlatformTraits.IsEmpty() && !PlatformTraits.HasAll(DependentPlatformTraits))
	{
		return false;
	}

	// 如果平台具有任何排除特性，则不激活此配置
	if (!ExcludedPlatformTraits.IsEmpty() && PlatformTraits.HasAny(ExcludedPlatformTraits))
	{
		return false;
	}

	return true;  // 通过所有检查，可以激活
}

// 注册配置对的实现
bool FMappableConfigPair::RegisterPair(const FMappableConfigPair& Pair)
{
	// 获取资源管理器单例
	ULyraAssetManager& AssetManager = ULyraAssetManager::Get();

	// 获取本地设置
	if (ULyraSettingsLocal* Settings = ULyraSettingsLocal::Get())
	{
		// 使用设置注册对，但暂时不激活
		// 通过资源管理器获取加载的配置
		if (const UPlayerMappableInputConfig* LoadedConfig = AssetManager.GetAsset(Pair.Config))
		{
			// 注册输入配置，false表示不立即激活
			Settings->RegisterInputConfig(Pair.Type, LoadedConfig, false);
			return true;  // 注册成功
		}	
	}
	
	return false;  // 注册失败
}

// 注销配置对的实现
void FMappableConfigPair::UnregisterPair(const FMappableConfigPair& Pair)
{
	// 获取资源管理器单例
	ULyraAssetManager& AssetManager = ULyraAssetManager::Get();

	// 获取本地设置
	if (ULyraSettingsLocal* Settings = ULyraSettingsLocal::Get())
	{
		// 通过资源管理器获取加载的配置
		if (const UPlayerMappableInputConfig* LoadedConfig = AssetManager.GetAsset(Pair.Config))
		{
			// 注销输入配置
			Settings->UnregisterInputConfig(LoadedConfig);
		}
	}
}